// 基本类型
const str: string = 'string'
const num: number = 123
const flag: boolean = true

const und: undefined = undefined
const nul: null = null

// 联合类型
const phone: number | string = 123

interface IAge {
    age: number
}

interface IAddress {
    address: string
}

// 类型别名
type Info = IAge & IAddress

const obj: Info = {
    age: 123,
    address: "string"
}


// 引用类型
// 接口  interface

interface IInfoType {
    userName: string,
    age: number,
    // ?  可有可无  如果是有的话, 必须按照约定类型定义
    rem?: boolean,

}

const info: IInfoType = {
    userName: "string",
    age: 20
}



// 枚举
// tsc index.ts

// enum Direction {
//     up,
//     down,
//     left,
//     right
// }


// type Dir = 'up' | 'down'

enum Direction {
    U = "up",
    D = "down",
    L = "left",
    R = "right"
}

// console.log(Direction)

// 数组
const arr: number[] = [1, 2, 3]
const arr2: Array<number> = [4, 5, 6]

// 元组 tuple
const arr3: [number, string] = [1, '2']


// function echo(arg) {
//     return arg
// }

// 泛型
// function echo<T>(arg:T): T {
//     return arg
// }

// 约束性泛型
interface ILength {
    length: number
}


function echo<T extends ILength>(arg:T): T {
    console.log(arg.length)
    return arg
}

echo([1, 2, 3])




